package gov.nasa.anml.lifted;

import gov.nasa.anml.utility.SimpleObject;
import gov.nasa.anml.utility.SimpleString;


public interface Scope extends StatementContainer {

	//public abstract Scope nest(Scope o); // as in nesting/parent/reference
	//public abstract Scope extend(Scope o); // as in inheritance/copy
	
	public abstract Identifier<?,?> resolveSymbol(SimpleString n);
	public abstract Parameter<?> resolveParameter(SimpleString n);
	public abstract Type<?> resolveType(SimpleString n);
	public abstract Constant<?> resolveConstant(SimpleString n);
	public abstract ConstantFunction<?> resolveConstantFunction(SimpleString n);
	public abstract Fluent<?> resolveFluent(SimpleString n);
	public abstract FluentFunction<?> resolveFluentFunction(SimpleString n);
	public abstract Action resolveAction(SimpleString n);
	
	public abstract Identifier<?,?> addSymbol(Identifier<?,?> s);
	public abstract Identifier<?,?> getSymbol(SimpleString s);
	
	public abstract <T extends SimpleObject<? super T>> Parameter<T> addParameter(Parameter<T> t);

	public abstract <T extends SimpleObject<? super T>> Constant<T> addConstant(Constant<T> c);

	public abstract <T extends SimpleObject<? super T>> ConstantFunction<T> addConstantFunction(ConstantFunction<T> c);

	public abstract <T extends SimpleObject<? super T>> Fluent<T> addFluent(Fluent<T> f);

	public abstract <T extends SimpleObject<? super T>> FluentFunction<T> addFluentFunction(FluentFunction<T> f);

	public abstract <T extends SimpleObject<? super T>> Type<T> addType(Type<T> t);

	public abstract Action addAction(Action a);

	public abstract SimpleString getParameterName(int p);

	public abstract SimpleString getConstantName(int c);

	public abstract SimpleString getConstantFunctionName(int c);

	public abstract SimpleString getFluentName(int f);

	public abstract SimpleString getFluentFunctionName(int f);

	public abstract SimpleString getActionName(int a);

	public abstract Parameter<?> getParameter(int p);

	public abstract Constant<?> getConstant(int c);

	public abstract ConstantFunction<?> getConstantFunction(int c);

	public abstract Fluent<?> getFluent(int f);

	public abstract FluentFunction<?> getFluentFunction(int f);

	public abstract Action getAction(int a);

	public abstract Parameter<?> getParameter(SimpleString p);

	public abstract Constant<?> getConstant(SimpleString c);

	public abstract ConstantFunction<?> getConstantFunction(SimpleString c);

	public abstract Fluent<?> getFluent(SimpleString f);

	public abstract FluentFunction<?> getFluentFunction(SimpleString f);

	public abstract Action getAction(SimpleString a);

	public abstract Type<?> getType(SimpleString t);

	public abstract SimpleString getTypeName(int t);

	public abstract Type<?> getType(int t);
	public Statement addStatement(Statement s);
	public Scope getParent();
	public void setParent(Scope parent);

}